package ae.pcfc.cldos.online.fnp.service.client;

import java.util.Date;
import java.util.List;

import ae.pcfc.cldos.online.fnp.exception.FNPException;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPAccountTypeVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPCancelPaymentReqVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPCatalogVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPFinalPaymentResponseVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPGeneralInfoVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPParameterVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPPaymentAdviceReqVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPPaymentAdviceRspnsVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPPrepaidTransactionVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPReportReqVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPReportResponseVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPTransReportReqVO;
import ae.pcfc.cldos.online.fnp.service.client.vo.FNPTransReportResponseVO;


public interface FinanceNPaymentFNP  {
	/**
	 * @return List<FNPCatalogVO>
	 * @throws FNPException
	 * @{@link Parameter} List<String> fnpServiceCodeList
	 */
	List<FNPCatalogVO> retreiveFNPCatalog(List<String> fnpServiceCodeList) throws FNPException;
	/**
	 * @param List<String> serviceIdList
	 * @return List<FNPParameterVO>
	 * @throws FNPException
	 */
	List<FNPParameterVO> retreiveFNPParameters(List<String> serviceIdList) throws FNPException;
	/**
	 * @param fnpPaymentAdviceReqVO
	 * @return FNPPaymentAdviceRspnsVO
	 * @throws FNPException
	 */
	public FNPPaymentAdviceRspnsVO generatePaymentAdvice(FNPPaymentAdviceReqVO fnpPaymentAdviceReqVO)throws FNPException;
	/**
	 * @param clentId
	 * @return FNPAccountTypeVO
	 * @throws FNPException
	 */
	public FNPAccountTypeVO enquireDeposits(String clentId)throws FNPException;
	/**
	 * @param fnpCancelPaymentReqVO
	 * @return
	 * @throws FNPException
	 */
	public boolean cancelPayment(FNPCancelPaymentReqVO fnpCancelPaymentReqVO)throws FNPException;
	/**
	 * @param fnpGeneralInfoVO
	 * @return
	 * @throws FNPException
	 */
	public FNPFinalPaymentResponseVO finalizePayment(FNPGeneralInfoVO fnpGeneralInfoVO)throws FNPException;
	/**
	 * @param fnpBlockUnBlockAmountVO
	 * @return
	 * @throws FNPException
	 */
	public boolean unblockAmount(FNPGeneralInfoVO fnpBlockUnBlockAmountVO)throws FNPException;
	/**
	 * @param fnpBlockUnBlockAmountVO
	 * @return
	 * @throws FNPException
	 */
	public boolean blockAmount(FNPGeneralInfoVO fnpBlockUnBlockAmountVO)throws FNPException;
	/**
	 * @param fnpPaymentAdviceReqVO
	 * @return
	 * @throws FNPException
	 */
	public FNPPaymentAdviceRspnsVO previewPaymentAdvice(FNPPaymentAdviceReqVO fnpPaymentAdviceReqVO) throws FNPException;
	/**
	 * @param clientId
	 * @param startDate
	 * @param endDate
	 * @return
	 * @throws FNPException
	 */
	public List<FNPPrepaidTransactionVO> enquireDepositTransaction(String clientId, Date startDate, Date endDate) throws FNPException;
	
	/**
	 * @param fnpReportReqVO
	 * @return
	 * @throws FNPException
	 */
	public FNPReportResponseVO generateClientAccountReport(FNPReportReqVO fnpReportReqVO) throws FNPException;
	/**
	 * @param fnpTransReportReqVO
	 * @return
	 */
	public List<FNPTransReportResponseVO> retreiveFNPTransactionReport(FNPTransReportReqVO fnpTransReportReqVO);
	
}
